﻿#ifndef QRENCODER_H
#define QRENCODER_H
/**
 * @file QlyQREncode
 * @author LiYuan
 * @email 18069211@qq.com
 * @version v1.0
 * @license GPL2.0
 * @brief libqrencode 库的一个简单封装，用于在 Qt 程序中生成条形码。
 * @details 因为用到了 QPainter 和 QImage， 所以需要 QtGui 模块。
 *          可用于 Qt4 和 Qt5 代码中。Qt6 还没有测试。
 * @copyright 2015-2021
 */

#include <QString>
#include <QPainter>
#include "qrencode.h"

/**
 * @brief The QREncoder class 对 libqrencode 的一个简单的封装类。只封装了一小部分功能。
 */
class QlyQREncode
{
public:
    QlyQREncode();
    ~QlyQREncode();

    /**
     * @brief setErrorCorrectionLevel 设置校验的等级。通常用默认值就够了。
     * @param level 从低到高有四档 QR_ECLEVEL_L, QR_ECLEVEL_M, QR_ECLEVEL_Q, QR_ECLEVEL_H
     */
    void setErrorCorrectionLevel(QRecLevel level = QR_ECLEVEL_M);

    /**
     * @brief encodeString 将一个字符串编码为一个 QR 码。
     * @param str
     * @return
     */
    bool encodeString(QString str);
    bool encodeString8Bit(QString str);
    /**
     * @brief encodeStringMQR 将一个字符串编码为一个 MicroQR 码。
     * @param str
     * @return
     */
    bool encodeStringMQR(QString str);
    bool encodeStringMQR8Bit(QString str);

    /**
     * @brief setColor 设置图像的前景色和背景色，通常为白底黑色码
     * @param foreground 前景色，通常为黑色
     * @param background 背景色，通常为白色
     */
    void setColor(QColor foreground = Qt::black, QColor background = Qt::white);
    /**
     * @brief renderNoBackground 用于将 QR 码画到界面上或者画到图像中。只画前景色部分，保留原始的背景。
     * @param painter
     * @param rect QR 码所在区域，可以不是正方形。但是最好是正方形。
     * @return
     */
    bool renderNoBackground(QPainter &painter, QRect rect) const;
    bool renderNoBackground(QPainter &painter, int width, int height) const;

    /**
     * @brief render 用于将 QR 码画到界面上或者画到图像中。用 background 填充背景。
     * @param painter
     * @param background 背景颜色
     * @param foreground 前景颜色
     * @param rect QR 码所在区域，可以不是正方形。但是最好是正方形。
     * @return
     */
    bool render(QPainter &painter,
              QColor background,
              QColor foreground,
              QRect rect = QRect()) const;


    /**
     * @brief toImage 将 QR 码转化为一个图像。
     * @param size 图像的尺寸。因为 QR 码是方形的，所以给出一个数值就可以了。
     * @return
     */
    QImage toImage(int size = 0) const;

    /**
     * @brief saveImage 将 QR 码图像保存到文件中。
     * @param fileName 文件名，需要给出后缀。
     * @param size 图像尺寸。因为 QR 码是方形的，所以给出一个数值就可以了。
     * @return
     */
    bool saveImage(QString fileName, int size = 0) const;

    /**
     * @brief QRWidth 获得 QR 码的宽度。
     * @return
     */
    int QRWidth() const;
private:
    QRcode *m_qr;
    QRencodeMode m_hint;
    QRecLevel m_eclevel;
    int m_version;
    bool m_casesensitive;
    QColor m_background;
    QColor m_foreground;
};

#endif // QRENCODER_H
